# -*- coding: UTF-8 -*-
'''
元字符的完整列表:    . ^ $ * + ? { [ ] \ | ( )
[]:指定一个字符集，元字符在字符集并不起作用，恢复成普通字符
():分组   -> (?P<name>) 对分组命名，避免索引访问
|:or   eg: abc|def，在[]恢复成普通字符
'''

import re


s1 = 'abcbd'

'''
findall方法，返回所有的与给定的表达式匹配的一个list；
finditer方法，返回所有与给定的表达式匹配的matchobject的iterator

matchobject为re.search,re.match等匹配成功后返回的对象，包含了匹配的结果
在正则表达式中，可以使用()来将部分正则表达式分组且编号，编号从1开始，使用数字来使用

matchobject.group()包含了所有匹配的内容，等价于matchobject.group(0)，此时的0表示所有的匹配
matchobject.lastindex, 表示正则表达式中分组()的个数
'''

print 're.match'
# r:raw 保持原状
mr = re.match(r'a([bcd]*)b', s1)
if mr:
    print mr.group()
    print mr.group(1)
# 分组：() ；组可以被嵌套。计数的数值可以能过从左到右计算打开的括号数来确定
mr = re.match(r'(a(b)c)d', 'abcd')
if mr:
    print '(): ' + mr.group()
    print '(): ' + mr.group(1)
    print '(): ' + mr.group(2)

# re.search只返回第一个匹配
print 're.search'
sr = re.search(r'([bcd]*)b', s1)
if sr:
    print sr.group()
    print sr.group(1)
    
print 'end'
